package bean.dao;

import java.util.List;
import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class HibernateCuentasDAO {
	private static HibernateCuentasDAO instancia = null;
	private static SessionFactory sf = null;

	public static HibernateCuentasDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateCuentasDAO();
		} 
		return instancia;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> telefonosPorTipo(){
		Session session = sf.openSession();
				
		List<Object[]> lista = session.createQuery(
				"select tel.tipo, count(*) from Telefono tel group by tel.tipo")
				.list();

		session.close();
		return lista;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> telefonosPorArea(List<String> lstareas){
		Session session = sf.openSession();
	
		List<Object[]> lista = session.createQuery(
				"select tel.id.area, count(tel.id.numero) from Telefono tel " +
				"group by tel.id.area having tel.id.area in (:areas)")
				.setParameterList("areas", lstareas)
				.list(); 
		
		session.close();
		return lista;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> saldoPorUsuario(){
		Session session = sf.openSession();
	
		List<Object[]> lista = session.createQuery(
				"select u.cuit, u.nombre, sum(c.saldo) as total " +
				"from Usuario u join u.cuentas c " +
				"group by u.cuit, u.nombre " +
				"order by sum(c.saldo) desc, u.nombre")
				.list(); 
		
		session.close();
		return lista;
	}

	public List<Object[]> porTipoCuenta() {
		// TODO Auto-generated method stub
		Session session = sf.openSession();
		
		List<Object[]> list = session.createQuery("select c.tipo, count(*) from Cuenta c group by c.tipo").list();
		session.close();
		return list;
	}

	public List<Object[]> PorLocalidad() {
		// TODO Auto-generated method stub
		Session session = sf.openSession();
		List<Object[]> list = session.createQuery("select d.domicilio.localidad, count(*) from Usuario d group by d.domicilio.localidad").list();
		return list;
	}

	public List<Object[]> listadoUsuariosTelefonos() {
		// TODO Auto-generated method stub
		Session session = sf.openSession();
//		List<Object[]> list = session.createQuery("select usu.nombre, usu.domicilio.direccion, cuentas.saldo, cuentas from Usuario usu join usu.cuentas cuentas").list();
		List<Object[]> list = session.createQuery("select usu, telefonos from Usuario usu join usu.telefonos telefonos").list();
		session.close();
		return list;
	}

	public List<Object[]> listadoUsuariosTelefonosConWhere(String string) {
		// TODO Auto-generated method stub
		Session session = sf.openSession();
//		List<Object[]> list2 = session.createQuery("from Usuario usu where usu.cuit = 'c1234'" ).list(); // ESTA NO FUNCIONO, DA bean.Usuario cannot be cast to [Ljava.lang.Object
		
		/** Ejemplo seteando parametros con ?**/
//		List<Object[]> list2 = session.createQuery("select usu, telefonos from Usuario usu join usu.telefonos telefonos where usu.cuit = ?" ).setString(0, string).list();
		/** Ejemplo seteando parametros con :name **/
		List<Object[]> list2 = session.createQuery("select usu, telefonos from Usuario usu join usu.telefonos telefonos where usu.cuit = :cuit" ).setString("cuit", string).list();
		
//		List<Object[]> list2 = session.createQuery("select u.nombre from Usuario u" ).list(); // CON ESTA NO ANDA PORQUE DEVUELVE UNA SOLA COLUMNA
//		List<Object[]> list2 = session.createQuery("select u.nombre, u.cuit from Usuario u" ).list();
		return list2;
	}

	public List<Object[]> listadoUsuariosTelefonosConWhereIn(List<String> in) {
		// TODO Auto-generated method stub
		Session session = sf.openSession();
		List<Object[]> listin = session.createQuery("select usu, telefonos from Usuario usu join usu.telefonos telefonos where usu.cuit in (:nombres) order by 1" ).setParameterList("nombres", in).list();
		session.close();
		return listin;
	}

	public List<Object[]> listadoUsuariosSubconsulta(String user) {
		// TODO Auto-generated method stub
		Session session = sf.openSession();
		List<Object[]> list = session.createQuery("select usu, telefonos from Usuario usu join usu.telefonos telefonos where usu.cuit in (select u.cuit from Usuario u where u.nombre =:user)").setParameter("user", user).list();
		session.close();
		return list;
	}
}
